package cn.itcast.n4.exercise;
/**
 * 模拟卖票问题
 * @author yd
 * @date 2022/3/15 23:43
 * @version 1.0
 */

import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Vector;

@Slf4j(topic = "w.ExerciseSell")
public class ExerciseSell {

    public static void main(String[] args) throws InterruptedException {
        //模拟多人买票
        TicketWindow window = new TicketWindow(10000);

        //所有线程的集合
        List<Thread> threadList = new ArrayList<>();
        //卖出的票数统计
        List<Integer> amountList = new Vector<>();
        for (int i = 0; i < 2000; i++) {
            Thread thread = new Thread(() -> {
                //买票
                int amount = window.sell(randomAmount());
                try {
                    Thread.sleep(randomAmount());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                amountList.add(amount);
            });
            threadList.add(thread);
            thread.start();
        }

        for (Thread thread : threadList) {
            thread.join();
        }

        //统计卖出的票数和剩余票数
        log.debug("余票 {}", window.getCount());
        log.debug("卖出的票数 {}", amountList.stream().mapToInt(i -> i).sum());

    }
    //Random为线程安全
    static Random random = new Random();

    //随机1-5
    public static int randomAmount(){
        return random.nextInt(5) + 1;
    }


}

//售票窗口
class TicketWindow{
    private int count;

    public TicketWindow(int count){
        this.count = count;
    }

    //获取余票数量
    public int getCount() {
        return count;
    }
    //售票
    public int sell(int amount){
        if(this.count >= amount){
            this.count -= amount;
            return amount;
        }else {
            return 0;
        }

    }

}